#include "stm32f10x.h"

void GPIO_Configuration(void);
void EXTI_Configuration(void);
u8 key_val = 1;
void delay_ms(u16 xms);
int main() {

    GPIO_Configuration();
    EXTI_Configuration();

    while (1) {
        if (key_val) {
            GPIOE->BRR |= GPIO_Pin_5;
        } else {
            GPIOE->BSRR |= GPIO_Pin_5;
        }
    }

}

void GPIO_Configuration() {
    // PE4 ----> KEY0
    RCC->APB2ENR = 1 << 6;  // 开启GPIOE的时钟

    GPIOE->CRL &= 0xfff0ffff;  // 设置PE4
    GPIOE->CRL |= 0x00080000;  // PE4 设置为上拉或下拉输入
    GPIOE->ODR |= 1 << 4;      // PE4 上拉输入、

    // PE5 ----> LED1
    GPIOE->CRL &= 0xff0fffff;
    GPIOE->CRL |= 0x00300000; // LED1 设置为通用推挽输出 最大输出频率为50Hz


    GPIOE->BSRR |= GPIO_Pin_5; // LED0灭
}


void EXTI_Configuration() {
    RCC->APB2ENR |= 1; // 开启AFIO的时钟
    // PE4 ----> KEY0
    AFIO->EXTICR[1] |= 0x0004; // 设置 EXTI4 ---> PE4

    EXTI->IMR |= 1<<4; // 禁止对Line4的屏蔽，即允许EXTI4中断
    EXTI->FTSR |= 1<<4; // 配置EXTI4下降沿触发中断
    NVIC->ISER[0] |= 1<<10; // 中断使能寄存器 ISER[0] --> 0-23 ISER[1]0-27 --> 32-59   EXTI4_IRQn 
}

void EXTI4_IRQHandler(void) {
    if (EXTI->PR & 1<<4) {
        delay_ms(200);
        key_val = !key_val;
        EXTI->PR |= 1<<4; // 清除中断触发请求(向PR[5]写入1。 写入操作可以清除位)
    }
}

void delay_ms(u16 xms) {
    u16 i, j;

    for (i = 0; i < xms; i++) {
        for (j = 0; j < 7992; j++)
            ;
    }
}



